package com.yeti.service;

import java.util.ArrayList;
import java.util.List;

import com.yeti.domain.Cliente;
import com.yeti.domain.Lista;

public interface ListaService {
	
	/**
	 * Metodo que crea una nueva lista.
	 * 
	 * @param titulo: Es el nombre que tendrá la lista.
	 * @param username: Es el nombre de usuario del administrador de la lista.
	 */
	public void addLista(String titulo,String username);
	
	/**
	 * Metodo que actualiza el nombre de una lista.
	 * 
	 * @param id: Es el id de la lista a actualizar.
	 * @param nombre: Es el nombre que tendrá la lista.
	 */
	public void updateLista(int id, String nombre);
	
	/**
	 * Metodo que busca una lista por id.
	 * 
	 * @param id: Es el id de la lista a buscar.
	 * @return: Devuelve una lista dado un id.
	 */
	public Lista getLista(int id);
	
	/**
	 * Metodo que devuelve las listas de un usuario.
	 * 
	 * @param usernmae: Es el nombre del usuario del que se devolveran las listas.
	 * @param: Devuelve las listas del usuario.
	 */
	public List<Lista> getListas(String username);
	
	/**
	 * Metodo que obtiene las listas de un usuario paginado.
	 * 
	 * @param usernmae: Es el nombre de usuario del que se obtendran las listas.
	 * @param page: Es la página a devolver.
	 * @return: devuelve una lista de listas de la página pedida.
	 */
	public ArrayList<Object> getListas(String username,int page);
	
	/**
	 * Metodo que quita una lista a un usuario.
	 * 
	 * @param id: Es el id de la lista a quitar.
	 * @param username: Es el usuario del cual quitaremos la lista.
	 */
	public void removeLista(int id, String username);
	
	/**
	 * Metodo que añade un producto a una lista.
	 * 
	 * @param id: Es el id de la lista a añadir el producto.
	 * @param nombre: Es el nombre del producto.
	 * @param cantidad: Es la cantidad de unidades del producto.
	 * @param precio: Es el precio del producto.
	 * @return: Devuelve true si la operación finaliza correctamente, false en caso contrario.
	 */
	public boolean addProducto(int id, String nombre, int cantidad, float precio);
	
	/**
	 * Metodo que actualiza un producto de una lista.
	 * 
	 * @param idLista: Es el id de la lista de donde procede el producto.
	 * @param idProducto: Es el id del producto a actualizar.
	 * @param nombre: Es el nuevo nombre del producto.
	 * @param cantidad: Es la nueva cantidad del producto.
	 * @param precio: Es el nuevo precio.
	 * @return: Devuelve true en caso de que la operación se produzca con éxito, false en caso contrario.
	 */
	public boolean updateProducto(int idLista, int idProducto, String nombre, int cantidad, float precio);
	
	/**
	 * Metodo que elimina un producto de la lista.
	 * 
	 * @param idLista: Es el id de la lista de donde se eliminará el producto.
	 * @param idProducto: Es el id del producto a eliminar.
	 */
	public void removeProducto(int idLista, int idProducto);

	/**
	 * Metodo que devuelve todos los amigos que se pueden seleccionar de esa lista.
	 * 
	 * @param idLista: Es el id de la lista de la cual se realizara el calculo.
	 * @return: Devuelve una lista con todos los usuarios seleccionables.
	 */
	public List<Cliente> getListaAmigosSeleccionables(int listaId);

	/**
	 * Metodo que devuelve todos los amigos que pertenecen a una lista menos el mismo.
	 * 
	 * @param idLista: Es el id de la lista de la cual se realizara el calculo.
	 * @param username:Es el username del que realiza la accion para no cogerlo entre los gestores
	 * @return: Devuelve una lista con todos los usuarios seleccionables.
	 */
	public List<Cliente> getAmigosInLista(int listaId, String username);

	public boolean addAmigo(int listaId, int idAmigo);

	/**
	 * Metodo que quita de una lista a un usuario.
	 * 
	 * @param id: Es el id de la lista a quitar.
	 * @param idAmigo: Es el usuario del cual lo quitaremos de la lista.
	 */
	void removeAmigo(int idLista, int idAmigo);
}
